#include "Listen_Connection.h"

//解决循环引用问题 -- 头源分离
//#include "Reactor_server.h"//在源文件里包含就不会导致互相包含问题了

class reactor_server;

//重写虚函数的实现(不用加virtual和override了, 因为listen_connection::已经能让编译器知道这个函数的所属类和声明了, 两个关节子只用在声明里加即可)
void listen_connection::receive()
{
    std::cout << "进入listen_connection::receive" << std::endl;

    //读事件就绪了, 不能保证一次能把本轮数据读完(也许一次来了多个连接请求) -- 在ET模式下: [必须]一次把所有数据全部读(这里是accept)上来 -- while进行accept
    while(true)
    {
        Inet_Addr client;
        int io_sockfd = _sockfd_ptr->accept_socket(client);
        if(io_sockfd == ACCEPT_DONE) //读完了, 底层没有新连接请求了
            break;  

        else if(io_sockfd == ACCEPT_CONTINUE) //进程被信号打断, 继续读
            continue; 

        else// 读到新连接了 -- 处理连接: 插入reactor_server的连接管理器 -- 通过回指指针
        {
            //1. 创建io_connection
            std::shared_ptr<connection> io_con = std::make_shared<io_connection>(io_sockfd, EPOLLIN | EPOLLET/*TODO*/, client);

            //2. 为io_connection对象注册io_handle_func
            io_con->register_io_handle_func(this->_io_handle_func);

            //3. 插入reactor_server的连接管理器
            _server->insert_connection(io_con);//这里如果不解决循环引用问题就会err -- 不允许使用指向不完整类型的指针 -- 类的定义未包括在该文件中
            //reactor_server类和connection类家族强耦合

            //解决方法1: 头源分离 -- 本方法
            // 不在头文件中直接访问 _server 的成员，以避免要求在此处 reactor_server 为完整类型。
            // 在实现文件（例如 Listen_Connection.cpp）里包含 reactor_server 定义的文件, 再对 _server 的实际处理。
        }
    }
}